/* 
 * File:   Nave.hpp
 * 
 * Definicion de la clase nave que modela la nave a utilizar en el juego.
 */

#ifndef NAVE_HPP
#define	NAVE_HPP

#include "Modelo.hpp"
#include "Laser.hpp"
#include <list>

using namespace std;

class Nave : public Modelo {
public:
    /**
     * Constructor de la clase Nave.
     * 
     * @param scalado : La escala a aplicar al modelo que representa la nave.
     * @param nombre : Nombre del modelo de la Nave.
     * @param maxObj : Cantidad de Objetivos.
     */
    Nave(GLfloat scalado, char * nombre, int maxObj);


    /**
     * Este metodo permite dibujar la nave en la escena.
     */
    virtual void dibujar();


    /**
     * Este metodo permite dispara un laser de la lista de disparos
     */
    void disparar();




    /**
     * Este metodo permite dispara un laser de la lista de disparos.
     * Ademas define la direccion a la que debe ir el disparo.
     * 
     * @param x2 : Posicion en el eje X del objetivo.
     * @param y2 : Posicion en el eje Y del objetivo.
     * @param z2 : Posicion en el eje Z del objetivo.
     */
    void disparar(GLfloat x2, GLfloat y2, GLfloat z2);

    /**
     * Esta funcion permite obtener la puntuacion del usuario.
     * @return La puntuacion del usuario.
     */
    virtual int getScore();

    /**
     * Este metodo permite anadir puntos a la puntuacion del jugador.
     * @param s : La cantidad de puntos a sumar al puntaje actual.
     */
    virtual void addScore(int s); //agregar puntos al puntaje


    /**Este metodo permite mover la nave a la derecha*/
    void moverDer();


    /**
     * Este metodo permite mover la nave a la izquierda
     */
    void moverIzq();

    /**
     * Este metodo permite mover la nave hacia arriba.
     */
    void moverArriba();

    /**
     * Este metodo permite mover la nave hacia abajo.
     */
    void moverAbajo();


    /**
     * Este metodo permite dibujar los lasers en la escena.
     */
    void dibujarLasers();


    /**
     * Este metodo permite realizar los calculos de la tasa de disparos,
     * y ejecuta el metodo idle de cada disparo.
     * 
     * @param s : El frameskip actual. 
     */
    void idle(int s);


    /**
     * Este metodo permite deinir los limites de movimiento de la nave en X y Y.
     * 
     * @param w : El limite de ancho de la pantalla.
     * @param h : El limite de alto de la pantalla.
     */
    void setLimits(int w, int h);



    /**
     * Este metodo le indica a la nave que ha pasado al objetivo mas cercano 
     * Por ese motivo avanza 1 en el apuntador del arreglo que representa
     * un toroide.
     */
    void avanzarObjetivo(); 
    
 
    /**
 * Indica que la nave fue impactada y necesita un tiempo de invulnerabilidad.
 */
    void setImpactada(); //
    
    
    /**
 * Indica si la nave esta en su tiempo de recuperacion o no.
 * @return true si fue impactada false en caso contrario.
 */
    bool getImpactada();

    list<Laser> disparos; //lista con los lasers que la nave dispone
    
private:
    GLfloat angulo; //angulo en el movimiento derecho izquierdo
    GLfloat angulo_fb; //angulo de movimiento fontal
    int score; //puntaje total
    int reload; // tiempo de recarga
    int proxObj; //proximo objetivo a la vista
    int maxObjetivos; // maximo de objetivos
    bool impactada; // indica si la nave fue impactada o no
    int contador_impacto; // contador de tiempo de invulnerabilidad.
};


#endif	/* NAVE_HPP */

